home *** CD-ROM | disk | FTP | other *** search
- .8086
- ; db3scr.asm
- ;
- ;
- ;
- ; *********************************************************
- ; * To: P.C. magazine *
- ; * *
- ; * try this utility out for dbase 3.... *
- ; * *
- ; * assemble/link/exe2bin this file *
- ; * *
- ; * then edit a dbase screen file (.prg) , insert a *
- ; * *
- ; * ? '~00007924' *
- ; * quit dbase then type in db3scr1 *
- ; * *
- ; * load dbase, then DO your program *
- ; * *
- ; * you will notice a box appear, this utility will *
- ; * intercept dbase interupt 10h function 9 calls *
- ; * (write character + attribute) and then check for *
- ; * the ~ character if found it will accept starting x,y *
- ; * locations for a box and xlen,ylen *
- ; * x y xlyl *
- ; * ? '~00007924' *
- ; * *
- ; * result: a very fast box maker in a rather slow *
- ; * interpreter *
- ; * *
- ; * Try it out, I stayed up lots of nights *
- ; * when I first got MASM. *
- ; * Hope it is of interest to your readers, It is not *
- ; * too long for typeing *
- ; * *
- ; * Sincerely *
- ; * *
- ; * Mark J Landy *
- ; * *
- ; * 137 Homewood Ave. *
- ; * Yonkers, N.Y. 10701 *
- ; * *
- ; * Programmer/ Consultant *
- ; * *
- ; * *
- ; * phone: 914 969-0934 *
- ; * *
- ; *********************************************************
- ;
- ;
- ;
- ;
- ;
- ;
- ;
- ;
- ;
- ;
- ;
- ; test for use of function 9h in in 10h
- title db3scr.asm
- page 60,132
- UP_L EQU 201 ;ALL DOUBLE BARS
- UP_R EQU 187
- L_L EQU 200
- L_R EQU 188
- HORIZ EQU 205
- VERT EQU 186
- cseg segment
- assume cs:cseg
- org 0100h
- ASSUME DS:CSEG
- entry: jmp initialize
- ;
- ;all data
- ;
-
- UPL_V_DH DB 0 ; CONST FOR ROW Y DH
- UPL_H_DL DB 0 ; CONST FOR COL X DL
- MAX_CHAR_H DB 0 ; LENGTH OF X VECTOR
- MAX_CHAR_V DB 0 ; LENGTH OF Y VECTOR
- R1CHARYES DB 0
- R2CHARYES DB 0
- R3CHARYES DB 0
- R4CHARYES DB 0
- R5CHARYES DB 0
- R6CHARYES DB 0
- R7CHARYES DB 0
- R8CHARYES DB 0
- TNUMBER DB 0
- out_mess db '(c) 1986 Mark J Landy ',0ah,0dh,0ah,0dh
- db '\/...db3 screen enhancement installed....\/','$'
-
- cpyright db "(c) copyright 1986 Mark J Landy co."
- oldinterrupt10 dd ?
-
- ;
- BOX_LOOP:
- CALL INIT_CODE
- MOV DH,CS:[UPL_V_DH]
- MOV DL,CS:[UPL_H_DL]
- CALL SET_POS
- MOV AL,HORIZ ; HORIZ LINE ASCII DOUBLE BAR
- MOV CL,CS:[MAX_CHAR_H] ;UPPER
- CALL SCR_PRINT
- MOV DH,CS:[UPL_V_DH];+MAX_CHAR_V
- ADD DH,CS:[MAX_CHAR_V]
- MOV DL,CS:[UPL_H_DL]
- CALL SET_POS
- MOV AL,HORIZ ; HORIZ LINE ASCII DOUBLE BAR
- MOV CL,CS:[MAX_CHAR_H] ;LOWER
- CALL SCR_PRINT
- MOV DH,CS:[UPL_V_DH]
- MOV DL,CS:[UPL_H_DL]
- CALL SET_POS
- MOV AL,UP_L ;UPPER LEFT
- MOV CL,1
- CALL SCR_PRINT
- MOV DH,CS:[UPL_V_DH];+MAX_CHAR_V
- ADD DH,CS:[MAX_CHAR_V]
- MOV DL,CS:[UPL_H_DL]
- CALL SET_POS
- MOV AL,L_L ;LOWER LEFT
- MOV CL,1
- CALL SCR_PRINT
- MOV DH,CS:[UPL_V_DH];+MAX_CHAR_V
- ADD DH,CS:[MAX_CHAR_V]
- MOV DL,CS:[UPL_H_DL];+MAX_CHAR_H
- ADD DL,CS:[MAX_CHAR_H]
- CALL SET_POS
- MOV AL,L_R ;LOWER RIGHT
- MOV CL,1
- CALL SCR_PRINT
- MOV DH,CS:[UPL_V_DH]
- MOV DL,CS:[UPL_H_DL];+MAX_CHAR_H
- ADD DL,CS:[MAX_CHAR_H]
- CALL SET_POS
- MOV AL,UP_R ;UPPER RIGHT
- MOV CL,1
- CALL SCR_PRINT
- ;TWO VERTICAL LINES
- MOV DH,CS:[UPL_V_DH]
- MOV DL,CS:[UPL_H_DL]
- CALL VERT_LOOP
- MOV DH,CS:[UPL_V_DH]
- MOV DL,CS:[UPL_H_DL] ; +MAX_CHAR_H
- ADD DL,CS:[MAX_CHAR_H]
- CALL VERT_LOOP
- ;RETURN TO ONE CHAR RIGHT AND BELOW OF
- ;BOX UPLH, UPLV
- MOV DH,CS:[UPL_V_DH]
- MOV DL,CS:[UPL_H_DL]
- ADD DH,1
- ADD DL,1
- CALL SET_POS
- RET ;END BOX LOOP
-
-
- VERT_LOOP: ;ASSUMES CHARACTER IS IN AL
- ;AND NUMBER OF REPEATES IN CL
- ;CHECK LOOP BEGINS
- INC DH
- CALL SET_POS
- MOV AL,VERT
- MOV CL,1
- CALL SCR_PRINT
- MOV AH,CS:[UPL_V_DH] ;+MAX_CHAR_V-1
- ADD AH,CS:[MAX_CHAR_V]
- SUB AH,1
- CMP AH,DH
- JNZ VERT_LOOP
- ;CHECK LOOP ENDS
- RET
- INIT_CODE: ;SETS SCREEN TO UPPER LEFT CORNER
- MOV AH,2
- MOV BH,0
- MOV DH,0
- MOV DL,0
- INT 10H
- RET
- SET_POS:
- MOV AH,2
- MOV BH,0 ;SCREEN PAGE
- ; MOV DH,POS ROW ASSUMES THAT REGISTER IS LOADED
- ; MOV DL,POS COL PRIOR TO CALL
- INT 10H
- RET
- SCR_PRINT:
- MOV AH,9 ;ASSUMES CHAR CODE IN AL REGISITER
- MOV BH,0 ;PAGE NUMBER
- MOV BL,7
- ; MOV CL,NUM_CHAR_FIL 80 CHAR
- MOV CH,0 ; HIGH BIT OF CX REG
- INT 10H ;VIDEO SERVICES ROUTINE BIOS
- RET
- ; THE ABOVE ROUTINE ASSUME THE PRESENCE
- ;PRIOR TO CALLING SCR_PRINT YOU MUST
- ;LOAD AL WITH ASCII CHAR AND LOAD CL WITH DEC NUMBER OF REPEATS
- ;
- ; end of screen builds
- ;
- ;
- R1CYES PROC NEAR
- sub al,30h
- mov cl,10
- mul cl
- mov cs:tnumber,al
- mov cs:R1CHARYES,0
- MOV CS:R2CHARYES,1
- RET
- R1CYES ENDP
- R2CYES PROC NEAR
- sub al,30h
- add al,cs:[tnumber]
- mov cs:upl_v_dh,al
- mov cs:R2CHARYES,0
- MOV CS:R3CHARYES,1
- RET
- R2CYES ENDP
- R3CYES PROC NEAR
- sub al,30h
- mov cl,10
- mul cl
- mov cs:tnumber,al
- mov cs:R3CHARYES,0
- MOV CS:R4CHARYES,1
- RET
- R3CYES ENDP
- R4CYES PROC NEAR
- sub al,30h
- add al,cs:[tnumber]
- mov cs:upl_h_dl,al
- mov cs:R4CHARYES,0
- MOV CS:R5CHARYES,1
- RET
- R4CYES ENDP
- R5CYES PROC NEAR
- sub al,30h
- mov cl,10
- mul cl
- mov cs:tnumber,al
- mov cs:R5CHARYES,0
- MOV CS:R6CHARYES,1
- RET
- R5CYES ENDP
- R6CYES PROC NEAR
- sub al,30h
- add al,cs:[tnumber]
- mov cs:max_char_h,al
- mov cs:R6CHARYES,0
- MOV CS:R7CHARYES,1
- RET
- R6CYES ENDP
- R7CYES PROC NEAR
- sub al,30h
- mov cl,10
- mul cl
- mov cs:tnumber,al
- mov cs:R7CHARYES,0
- mov cs:R8CHARYES,1
- RET
- R7CYES ENDP
- R8CYES PROC NEAR
- sub al,30h
- add al,cs:[tnumber]
- mov cs:max_char_v,al
- mov cs:R8CHARYES,0
- RET
- R8CYES ENDP
-
- newinterrupt10 proc far
- cmp ah,9
- jz checkchar
- jmp cs:[oldinterrupt10]
- checkchar:
- CMP AL,'~'
- JZ CS:SETR1CHAR
- push ax
- push bx
- push cx
- push dx
- push di
- push ds
- push es
- cmp cs:[R1CHARYES],1
- jz GOC1 ;1ST
- CMP CS:[R2CHARYES],1
- JZ GOC2 ;2ND
- CMP CS:[R3CHARYES],1
- JZ GOC3 ;3RD
- CMP CS:[R4CHARYES],1
- JZ GOC4 ;4TH
- CMP CS:[R5CHARYES],1
- JZ GOC5 ;5TH
- CMP CS:[R6CHARYES],1
- JZ GOC6 ;6TH
- CMP CS:[R7CHARYES],1
- JZ GOC7 ;7TH
- CMP CS:[R8CHARYES],1
- JZ GOC8 ;8TH
- pop es
- pop ds
- pop di
- pop dx
- pop cx
- pop bx
- pop ax
- mov ah,9
- jmp cs:[oldinterrupt10]
- exit_10:
- pop es
- pop ds
- pop di
- pop dx
- pop cx
- pop bx
- pop ax
- mov ah,9
- mov al,32
- jmp cs:[oldinterrupt10]
- SETR1CHAR:
- mov cs:R1CHARYES,1
- mov al,32
- jmp cs:[oldinterrupt10]
- GOC1:
- CALL NEAR PTR R1CYES
- JMP CS:EXIT_10
- GOC2:
- CALL NEAR PTR R2CYES
- JMP CS:EXIT_10
- GOC3:
- CALL NEAR PTR R3CYES
- JMP CS:EXIT_10
- GOC4:
- CALL NEAR PTR R4CYES
- JMP CS:EXIT_10
- GOC5:
- CALL NEAR PTR R5CYES
- JMP CS:EXIT_10
- GOC6:
- CALL NEAR PTR R6CYES
- JMP CS:EXIT_10
- GOC7:
- CALL NEAR PTR R7CYES
- JMP CS:EXIT_10
- GOC8:
- CALL NEAR PTR R8CYES
- call box_loop
- JMP CS:EXIT_10
- ; begin of screen builds
- ;
- newinterrupt10 endp
- ;
- ;
- ;initialization
-
- initialize:
- push cs
- pop ds
- mov dx,offset out_mess
- mov ah,9
- int 21h
- sub ax,ax
- mov ds,ax
- les bx,dword ptr ds:[10h * 4]
- mov word ptr cs:[oldinterrupt10],bx
- mov word ptr cs:[oldinterrupt10 + 2],es
- push cs
- pop ds
- mov dx,offset newinterrupt10
- mov ax,2510h
- int 21h
- mov dx,offset initialize
- int 27h ;terminate but stay resident
- cseg ends
- end entry
-
-
-
-
- ze
- int
-